<?php
/*class obj
{
    public $obj='内容3';//obj类的属性
    const ABC=1;
    public function output()
    {
        $this->obj='内容1';
        return  new SessionHandler();
    }
}
class json
{
    public $json;
    public function output()
    {
return json_encode(array(1,2,3,4,5));
    }
}
class str
{
    public $str;
    public function output()
    {
        return 'hello php';
    }
}
class a extends obj
{

}*/



/*$obj=new obj();//new obj()返回值是obj类的实例
$json=new json();
$str=new str();*/
//在类内部给obj类的$obj属性赋值：public $obj='内容1';(可以声明同时赋值)
//在类内部给obj类的$obj属性赋值：$this->obj='内容1';
//在类外部给obj类的$obj属性赋值：$obj->obj='内容1';

/*
public（公有）：公有的类成员可以在 任何地方 被访问。（例：你的名字大家都可以知道）
protected(受保护)：受保护的类成员则可以被其自身以及 子类 和 父类 访问。（例：你家的财产，你和你爸都可以拥有）
private(私有)：私有的类成员则只能被其定义所在的类（即 本类）访问。（例：你的私房钱，只有你自己知道）
const(常量)：const ABC=1;调用：obj::ABC;

1.当一个子类的方法和父类的方法完全一样，称为方法的重载

一、类继承的应用/class/animal.php
      1.声明一个子类，使用 extends 关键字 去继承（扩展）一个父类
      2.子类可以从父类，继承所有的内容，包括成员属性，成员方法， 构造方法 ..., 在子类中都可以直接使用
   访问类型控制
        1.虽然子类可以从父类中继承所有内容，但private的成员， 只能在本类中使用， 子类中也不能使用
        封装时，即可以让自己类的内部可以访问，也让子类可以用，但类的外部不能使用，


//调用父类的成员方式
   1.类名::方法名();
   2.parent::方法名();

二、静态:/class/task.php
在属性，和方法前加static 修饰，这种称为静态属性/静态方法.
静态属性与方法可以在不实例化类的情况下调用，
调用:
1.直接使用类名::方法名的方式进行调用。静态属性不允许对象使用$this->操作符调用。
2.静态方法中，$this伪变量不允许使用。可以使用self，parent，static在内部调用静态方法与属性。

总结:

1.静态属性用于保存类的公有数据;

2.静态方法里面只能访问静态属性;

3.静态成员不需要实例化对象就可以访问;

4.类的内部可以通过self和static关键字访问自身静态成员

5.可以通过parent关键字访问父类的静态成员

6.可以通过类名称定义一个公共方法在外部访问静态成员


三.接口/class/connector.php
语法：

Interface 接口名{

         //属性

         //方法

}

实现方法：
Class 类名 implements 接口名1，接口2


1、  定下规范，让别人实现（接口规定的方法必须都实现，都则会报错）

接口的细节
1、  不能去实例化一个接口

2、  接口中所有的所有方法都不能有方法体

3、  一个类可以实现多个接口，但是必须以逗号（，）隔开

Class 类名 implements 接口1，接口2，。。。{

}

4、  接口中可以有属性，但必须是常量，并且是public；

5、  接口的方法是public，不能是protected和private  （默认就是public）

6、  一个接口不能继承其他的类，但是可以继承别的接口（可以是多个）当继承了其他的接口后，
实现的类必须实现所有继承类中的方法

四.魔术方法/class/factory.php


1.__get函数是当我们想要调用类中不存在或者没有权限访问的属性时，php会默认的调用__get函数。
__set函数是当我们给类中的不存在或者没有权限访问的属性新增或者赋值时，php会默认的调用__set函数。

2.__call和__calStatic函数，对比__get函数，当我们想要调用类中不存在或者没有权限访问的方法时，
php会默认的调用__call函数。


五.抽象/class/abstraction.php

抽象方法
定义：一个方法如果没有方法体，则这个方法就是抽象方法。
1.一个方法们没有{}，直接使用分号结束的方法；
2.如果是抽象方法，必须使用abstract(抽象关键字来修饰)

抽象类
1.如果一个类中有一个方法是抽象方法，则这个类就是抽象类
2.必须加abstract关键字来修饰

注意：
1.只要有abstract来修饰的类就是抽象类，
2.抽象类是一种特殊的类，特殊在抽献给中可以有抽象方法
3.除了在抽象类中可以有抽象方法以外，和正常的类完全一样
4.抽象类不能实例化对象
5.如果看见抽象类，就必须写这个类的子类，将抽象类中的抽象方法覆盖(加上方法体）
6.子类必须全部覆盖重写抽象方法，这个子类才能创建对象，如果只实现部分，那么还有抽象方法，则类也就必须是抽象类

抽象方法作用：
1.抽象方法的作用就是规定了，子类必须有这个方法，功能交给子类
2.只写出来结构，而没有实现，实现交给具体的子类按自己的功能实现
抽象类的作用：
就是要求子类的结构，所以抽象类就是一个规范。


六.final关键字
1.final---用于类、方法前。

2.final类---不可被继承。

3.final方法---不可被覆盖。

3.final不能修饰属性

4.如果我们不希望一个类被继承，我们使用final来修饰这个类。这个类将无法被继承。

5.比如我们设定的Math类，涉及了我们要做的数学计算方法，这些算法也没有必要修改，也没有必要被继承，
我们把它设置成final类型。

6.如果不希望类中的某个方法被子类重写，我们可以设置这个方法为final方法，只需要在这个方法前加上final修饰符。
如果这个方法被子类重写，将会出现错误。

七.构造方法/class/work.php
__construct($name,$chepai)



八.instanceof关键字
作用：（1）判断一个对象是否是某个类的实例，（2）判断一个对象是否实现了某个接口。
var_export($obj instanceof obj);
*/



/*var_export($obj);//obj::__set_state(array(  'obj' => NULL,))
echo "<hr/>";
var_export($json);//json::__set_state(array(  'json' => NULL,))
echo "<hr/>";
var_export($str);//str::__set_state(array(  'str' => NULL,))*/



var_export($obj->output());//SessionHandler::__set_state(array( ))
echo "<hr/>";
var_export($json->output());//'[1,2,3,4,5]'
echo "<hr/>";
var_export($str->output());//'hello php'

